package d4_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理是一个单独的职责,开发中会把代理放在一个单独的类里面,
// 方便后面的,反复调用,不应该,在这里直接调用
public class ProxyUtil {
    //工具类,一般使用静态方法
    public static Star createProxy(Star bigStar) {
        //返回一个代理对象
        /*public static Object newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)*/
        Star s = (Star) Proxy.newProxyInstance(bigStar.getClass().getClassLoader(),
                new Class[]{Star.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //声明代理要干的事情
                        //proxy 代理对象本身
                        //method 把当前正在代理的方法对象送进来
                        //args 正在执行的方法参数
                        //将参数放在外面,便于返回
//                        Object rs = null;
                        if ("sing".equals(method.getName())) {//官方规范-->确定的放在前面
                            System.out.println("准备话筒,收钱");
//                            rs = method.invoke(bigStar,args);
                        } else if ("dance".equals(method.getName())) {
                            System.out.println("准备场地, 收钱");
//                            rs = method.invoke(bigStar, args);
                        }
                        //进行简化
                        Object rs = method.invoke(bigStar, args);
                        return rs;
                    }
                });

        return s;
    }
}
